package com.jiangds.open.util;

import com.jiangds.open.exception.CheckException;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.LinkedList;
import java.util.List;

/**
 * {@link FieldWrapper}  获取某个对象所有的字段,不包含接口字段和静态字段
 *
 * @author jiangliang
 * @since 2021/1/6 14:18
 */
public final class FieldWrapper {

    /**
     * 获取对用的所有非静态字段,包括从父类继承的字段
     * @param object 目标对象
     * @return 字段列表
     */
    public static List<Field> getAllInstanceField(Object object){
        if(object == null){
            throw new CheckException("目标对象不能为空!");
        }
        Class<?> superClass = object.getClass();
        List<Field> fields = new LinkedList<>();
        while (superClass!=Object.class){
            //获取所有的字段,过滤静态字段
            for (Field declaredField : superClass.getDeclaredFields()) {
                if(!Modifier.isStatic(declaredField.getModifiers())){
                    fields.add(declaredField);
                }
            }
            superClass = superClass.getSuperclass();
        }
        return fields;
    }
}
